#ifndef __OS_TIMER_H
#define __OS_TIMER_H

#include "osEvent.h"

typedef enum _E_TIMER_STATE
{
    TimerCreated,           // 已创建
    TimerStarted,           // 开始延时
    TimerRunning,           // 正在运行
    TimerStopped,           // 停止定时
    TimerDestroyed,         // 删除定时

} E_TIMER_STATE;


typedef struct _TIMER
{
    NODE_T      linkNode;               // 链接任务节点    
    uint32_t    startDelayTicks;        // 起始延时时间
    uint32_t    periodTicks;            // 周期运行时间
    uint32_t    delayTicks;             // 当前递减tick计数值
    void        (*timerFunc)(void* param); // 定时器回调函数
    void        *param;                 // 回调函数形参
    uint32_t    config;                 // 定时器配置函数
    E_TIMER_STATE state;                // 定时器状态    
} TIMER_T;

typedef struct _TIMER_INFO
{
    uint32_t    startDelayTicks;        // 起始延时时间
    uint32_t    periodTicks;            // 周期运行时间
    void        (*timerFunc)(void* param); // 定时器回调函数
    void        *param;                 // 回调函数形参
    uint32_t    config;                 // 定时器配置函数
    E_TIMER_STATE state;                // 定时器状态  
} TIMER_INFO_T;

/*
* CONFIG_TYPE_HEAD :   在硬件中断中运行，严格的定时运行
* CONFIG_TYPE_SOFT :   在任务中运行回调，可能会有定时滞后情况。
 */
#define TIMER_CONFIG_TYPE_HEAD          (1 << 0)
#define TIMER_CONFIG_TYPE_SOFT          (1 << 1)   

extern void     vTimerModuleInit(void);
extern void     vTimerModuleNotify(void);
extern void     vTimerInit(TIMER_T *timer, uint32_t delayTicks, uint32_t periodTicks,
                    void (*timerFunc)(void *), void *param, uint32_t config);
extern void     vTimerStart(TIMER_T *timer);
extern void     vTimerStop(TIMER_T *timer);
extern void     vTimerDestroy(TIMER_T *timer);
extern void     vTimerGetInfo(TIMER_T *timer, TIMER_INFO_T *info);






#endif // __OS_TIMER_H
